今天是數學課,要來說說時間複雜度跟漸進式符號
我們前面介紹了演算法的 5 大標準。
那要怎麼評斷哪個演算法是比較好的呢?
先來定義甚麼叫做「好」:通常來說,在可以達成相同結果的情況下,效率較佳的程式是比較好的。
因此,我們要用時間複雜度的概念,來評估演算法的效率。
而某個程式的 Time Complexity = 部署時間 + 執行時間
通常部署時間是與電腦效能有關,所以我們基本上會討論「執行時間」
那執行時間要怎麼得知呢?有兩種方式:
以下有個程式:
int function(int n){
int a;
a = 3;
for(int i = 1; i < n; i++){
a = (a + i) * 2;
}
return a;
}
這個程式總共執行了:
賦值給變數:1次 + for 迴圈判斷式:n 次 + for 迴圈內指令:n - 1 次 + return 敘述:1次 = 2n + 1 次
可能有人會問了,又不是每個指令的執行時間都一樣
沒錯,所以有另一種計算的方式就是把每個指令依照時間加權,然後算出執行次數
但一般來說,我們都會將每個指令的執行時間及難易程度視為相同
看看下面兩個程式
int function(int n){
int a = n + 3;
n = a;
return n;
}
int function(int n){
return n + 3;
}
上面兩個程式碼做的事情相同,但上面的花了 4 個指令完成,下面的只花了 2 個指令。
其實這兩個執行時間沒差多少,就因為 code style 的關係,我們因此要說上面的程式比下面的差嗎?
顯然並不是很公平,因此在數學上,有個符號來消除這種不平等,也就是漸進式符號(Asymptotic Notation)
我們不用指令的執行次數來評估,而是使用程式隨著輸入的資料量的增加之成長速率來評估
我們介紹 3 種最常見的:
如果看完定義已經傻了,那就來練習一題:
Q: f(n) = 4n + 9 則 O(?)?
Ans: 令g(n) = n,取 c = 5,n0 = 9,使得 0 <= 4n + 9 <= 5n,對所有的n >= 9皆成立,因此f(n) = O(g(n))
從定義來看,g(n) 就是一個界線,無論 f(n) 如何成長,最終只可能趨近於 g(n),而不會超過 g(n)
因此:
結束數學課啦,明天要進入第一個大主題了:Stack
參考網址:https://thedukh.com/2020/10/what-is-the-logarithmic-runtime-ologn/